# -*- coding: utf-8 -*-

"""
拼图素材管理器
负责管理多种图片来源，包括本地目录、剪贴板、屏幕截图和预置素材库
"""

import os
import shutil
from PyQt5.QtCore import QObject, pyqtSignal, QStandardPaths, QDir
from PyQt5.QtGui import QImage, QPixmap
import random


class PuzzleSourceManager(QObject):
    # 定义信号
    image_loaded = pyqtSignal(str)  # 图片加载完成信号，传递图片路径
    loading_progress = pyqtSignal(int)  # 加载进度信号
    error_occurred = pyqtSignal(str)  # 错误信号
    
    def __init__(self):
        super().__init__()
        # 初始化预置素材库路径
        self.builtin_library_path = os.path.join(
            QStandardPaths.writableLocation(QStandardPaths.AppDataLocation),
            "builtin_images"
        )
        self.ensure_builtin_library()
        
    def ensure_builtin_library(self):
        """确保预置素材库存在"""
        if not os.path.exists(self.builtin_library_path):
            os.makedirs(self.builtin_library_path, exist_ok=True)
            # 这里可以添加默认图片到预置库
            # 在实际应用中，应该将100张高清图片打包到程序中或下载到该目录
            
    def load_images_from_directory(self, directory_path):
        """
        从指定目录加载图片
        
        Args:
            directory_path (str): 目录路径
            
        Returns:
            list: 图片文件路径列表
        """
        image_files = []
        valid_extensions = ('.png', '.jpg', '.jpeg', '.bmp', '.gif')
        
        try:
            # 递归扫描目录
            for root, dirs, files in os.walk(directory_path):
                for file in files:
                    if file.lower().endswith(valid_extensions):
                        image_files.append(os.path.join(root, file))
        except Exception as e:
            self.error_occurred.emit(f"扫描目录时出错: {str(e)}")
            
        return image_files
    
    def get_images_from_clipboard(self):
        """
        从剪贴板获取图片
        
        Returns:
            str: 临时图片文件路径，如果剪贴板中没有图片则返回None
        """
        # 此方法应在主窗口中通过QApplication.clipboard()实现
        # 这里只提供接口说明
        return None
    
    def take_screenshot(self):
        """
        获取屏幕截图
        
        Returns:
            str: 截图文件路径
        """
        # 此方法应在主窗口中通过QApplication.primaryScreen()实现
        # 这里只提供接口说明
        return None
    
    def get_builtin_images(self):
        """
        获取预置素材库中的图片
        
        Returns:
            list: 预置图片文件路径列表
        """
        return self.load_images_from_directory(self.builtin_library_path)
    
    def get_random_image(self):
        """
        获取随机图片（优先从用户指定目录，然后是预置库）
        
        Returns:
            str: 图片文件路径
        """
        # 首先尝试从用户指定的目录获取图片
        user_image_dir = self.get_user_image_directory()
        if user_image_dir and os.path.exists(user_image_dir):
            images = self.load_images_from_directory(user_image_dir)
            if images:
                return random.choice(images)
        
        # 如果用户目录没有图片，则从预置库获取
        builtin_images = self.get_builtin_images()
        if builtin_images:
            return random.choice(builtin_images)
            
        return None
    
    def get_user_image_directory(self):
        """
        获取用户指定的图片目录
        
        Returns:
            str: 用户图片目录路径
        """
        # 从配置文件或设置中读取用户指定的目录
        # 这里返回None，实际应用中应该从配置中读取
        return None
    
    def set_user_image_directory(self, directory_path):
        """
        设置用户指定的图片目录
        
        Args:
            directory_path (str): 目录路径
        """
        # 保存用户指定的目录到配置文件或设置中
        pass
    
    def copy_images_to_user_directory(self, image_paths, target_directory=None):
        """
        复制图片到用户目录
        
        Args:
            image_paths (list): 源图片路径列表
            target_directory (str): 目标目录，如果为None则使用用户指定目录
        """
        if not target_directory:
            target_directory = self.get_user_image_directory()
            
        if not target_directory:
            self.error_occurred.emit("未指定目标目录")
            return
            
        if not os.path.exists(target_directory):
            os.makedirs(target_directory, exist_ok=True)
            
        for image_path in image_paths:
            try:
                filename = os.path.basename(image_path)
                target_path = os.path.join(target_directory, filename)
                shutil.copy2(image_path, target_path)
            except Exception as e:
                self.error_occurred.emit(f"复制图片时出错: {str(e)}")